module service.OfflineService;

import repository;
import model;
import client.MsgServerClient;
import msgtrans;
import hunt.logging;
import message.Constants;
import message.MsgDefine;
import std.conv : to;
import std.base64;

class OfflineService {

  static UnreceivedMessageRES processOffline(ulong userId)
  {
     auto offlineRepo = new OfflineRepository();
     UnreceivedMessageRES rep = new UnreceivedMessageRES();
     rep.clientId = userId;

     UnreceivedMessage um = new UnreceivedMessage;
     Offline[] offlineMsg = offlineRepo.findAllByID(to!string(userId));
     string chatId = null;
     int len = 0;
     Msg[][string] rt;
     foreach (Offline omsg ; offlineMsg)
     {
        if (omsg.backoff == 1)
        {
           continue;
        }

         Msg msg = new Msg;
         msg.chatId = omsg.chatId;
         msg.fromUserId = omsg.fromId;
         msg.messageId = omsg.messageId;
         msg.message = omsg.message;
         msg.localId = omsg.toId;
         msg.duration = omsg.duration;
         msg.ossObjectName = omsg.ossObjectName;
         msg.fileSize = omsg.fileSize;
         msg.msgTime = to!long(omsg.createTime);
         msg.type = cast(MsgType)(omsg.type);
         msg.binaryBase64 = cast(string) Base64.decode( omsg.binaryData   ) ;
         rt[omsg.chatId] ~= msg;
     }

     foreach (k ,v ; rt)
     {
        UnreceivedMessage um = new UnreceivedMessage;
        um.msgs = v;
        um.count = to!int(v.length);
        rep.unreceivedMessages ~= um;
     }

     return rep;
  }


  static void processPutOffline(Msg msg)
  {

    auto offlineRepo = new OfflineRepository();
   //  if (msg.type == MsgType.NOTICE_BACKOFF) 
   //  {
   //     auto suc = offlineRepo.backoffOffline(msg.messageId);
   //     if (!suc) {
   //        return ;
   //     }
   //  }
    auto userRepo = new UserRepository;
    //Offline obj = new Offline;
    //obj.chatId = chatId;
    //obj.fromId = fromId;
    //obj.toId = toId;
    //obj.message = message;
    //obj.createTime = cast(int)msgTime;
    //obj.type = type;
    offlineRepo.putOffline(msg);
    userRepo.addUnread(to!int(msg.localId));

  }

  static void processDelteOffline(string toId)
  {
     auto offlineRepo = new OfflineRepository();
     offlineRepo.deleteOffline(toId);
  }

  static void userOffline(string userId)
  {
      auto userRepo = new UserRepository;
      userRepo.updateStatus(to!int(userId),0);
  }

}

